#include<bits/stdc++.h>
using namespace std;
#define ll long long

bool check(const std::vector<int>& t, int k, int dis) {
    int cnt = 1;
    int lst = t[0];
    for (int a : t) {
        if (a - lst >= dis) {
            cnt++;
            lst = a;
        }
    }
    return cnt >= k;
}
// 10 3
// 1 3 4 5 7 9 11 13 15 17
void solve() {
    int n, k;
    cin >> n >> k;
    vector<int> pos(n);
    for (int i = 0; i < n; ++i) {
        cin >> pos[i];
    }
    sort(pos.begin(), pos.end());
    int left = 0;
    int right = pos.back() - pos.front();
    int result = 0;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (check(pos, k, mid)) {
            result = mid;
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    std::cout << result << std::endl;
}

int main() {
    solve();

    return 0;
}


//题目：最小值最大化
//
//描述：
//在一条直线上有n个点，从中选k个点，其中某两个点的距离distance是所有距离中最小的。要求选择合适的k个点，使得这个最小距离distance尽量大，并输出这个距离distance。
//输入格式
//第一行 两个正整数n和k，分别表示直线上的点数和要选取的点的数量。确保0<k<=n<=100000。
//第二行 n个数，分别表示n个点在直线上的坐标。确保各个坐标互不相等。
//输出格式
//一个数，表示答案。
//输入样例
// 10 3
// 1 3 4 5 7 9 11 13 15 17
//输出样例
//8